/**
 * @file file_utils_glib.cpp
 * @brief 基于GLib的文件读写工具函数实现
 * @details 使用GLib库提供跨平台兼容的文件操作
 */

#include "file_utils_glib.h"
#include "lyric_log.h"
#include <glib/gstdio.h>

/**
 * @brief 使用GLib从文件读取文本内容
 */
std::string glib_read_text_file(const gchar* file_path)
{
    if (!file_path) {
        lyric_log_error("glib_read_text_file: file_path is NULL");
        return "";
    }

    gchar* contents = NULL;
    gsize length = 0;
    GError* error = NULL;

    // 使用g_file_get_contents读取文件，自动处理编码
    gboolean success = g_file_get_contents(file_path, &contents, &length, &error);
    
    if (!success) {
        lyric_log_error("glib_read_text_file: failed to read file %s: %s", 
                       file_path, error ? error->message : "unknown error");
        if (error) {
            g_error_free(error);
        }
        return "";
    }

    if (error) {
        g_error_free(error);
    }

    // 确保内容以null结尾
    if (contents && length > 0) {
        // 检查是否为有效的UTF-8
        if (g_utf8_validate(contents, length, NULL)) {
            std::string result(contents, length);
            g_free(contents);
            return result;
        } else {
            // 如果不是UTF-8，尝试转换
            gchar* utf8_contents = g_convert(contents, length, "UTF-8", "GBK", NULL, NULL, NULL);
            if (utf8_contents) {
                std::string result(utf8_contents);
                g_free(utf8_contents);
                g_free(contents);
                return result;
            } else {
                // 转换失败，返回原内容
                std::string result(contents, length);
                g_free(contents);
                return result;
            }
        }
    }

    g_free(contents);
    return "";
}

/**
 * @brief 使用GLib写入文本内容到文件
 */
gboolean glib_write_text_file(const gchar* file_path, const gchar* content)
{
    if (!file_path || !content) {
        lyric_log_error("glib_write_text_file: file_path or content is NULL");
        return FALSE;
    }

    GError* error = NULL;
    
    // 确保目录存在
    gchar* dir_path = g_path_get_dirname(file_path);
    if (dir_path && !glib_mkdir_with_parents(dir_path)) {
        lyric_log_warning("glib_write_text_file: failed to create directory %s", dir_path);
    }
    g_free(dir_path);

    // 使用g_file_set_contents写入文件
    gboolean success = g_file_set_contents(file_path, content, -1, &error);
    
    if (!success) {
        lyric_log_error("glib_write_text_file: failed to write file %s: %s", 
                       file_path, error ? error->message : "unknown error");
        if (error) {
            g_error_free(error);
        }
        return FALSE;
    }

    if (error) {
        g_error_free(error);
    }

    lyric_log_debug("glib_write_text_file: successfully wrote %zu bytes to %s", 
                   strlen(content), file_path);
    return TRUE;
}

/**
 * @brief 检查文件是否存在
 */
gboolean glib_file_exists(const gchar* file_path)
{
    if (!file_path) {
        return FALSE;
    }
    
    return g_file_test(file_path, G_FILE_TEST_EXISTS);
}

/**
 * @brief 获取文件大小
 */
gint64 glib_get_file_size(const gchar* file_path)
{
    if (!file_path) {
        return -1;
    }

    GStatBuf stat_buf;
    if (g_stat(file_path, &stat_buf) == 0) {
        return stat_buf.st_size;
    }
    
    return -1;
}

/**
 * @brief 创建目录（递归创建父目录）
 */
gboolean glib_mkdir_with_parents(const gchar* dir_path)
{
    if (!dir_path) {
        return FALSE;
    }

    GError* error = NULL;
    gboolean success = g_mkdir_with_parents(dir_path, 0755, &error);
    
    if (!success && error) {
        lyric_log_error("glib_mkdir_with_parents: failed to create directory %s: %s", 
                       dir_path, error->message);
        g_error_free(error);
    }
    
    return success;
}

/**
 * @brief 获取歌词文件路径（使用GLib路径处理）
 */
gchar* glib_get_lrc_path(const gchar* track_uri, const gchar* suffix)
{
    if (!track_uri || !suffix) {
        return NULL;
    }

    // 使用GLib的路径处理函数
    gchar* base_name = g_path_get_basename(track_uri);
    gchar* dir_name = g_path_get_dirname(track_uri);
    
    // 移除文件扩展名
    gchar* name_without_ext = g_strdup(base_name);
    gchar* last_dot = g_strrstr(name_without_ext, ".");
    if (last_dot) {
        *last_dot = '\0';
    }
    
    // 构建新的文件路径
    gchar* new_filename = g_strconcat(name_without_ext, suffix, NULL);
    gchar* result = g_build_filename(dir_name, new_filename, NULL);
    
    // 清理临时变量
    g_free(base_name);
    g_free(dir_name);
    g_free(name_without_ext);
    g_free(new_filename);
    
    return result;
}

/**
 * @brief 从音频文件旁边获取歌词文件（使用GLib实现）
 */
gboolean glib_get_lyrics_next_to_file(const gchar* track_location, 
                                     gchar** lyrics_out, 
                                     gboolean* is_sync_out)
{
    if (!track_location || !lyrics_out || !is_sync_out) {
        return FALSE;
    }

    *lyrics_out = NULL;
    *is_sync_out = FALSE;

    // 尝试.lrc文件
    gchar* lrc_path = glib_get_lrc_path(track_location, ".lrc");
    if (lrc_path && glib_file_exists(lrc_path)) {
        std::string lyrics = glib_read_text_file(lrc_path);
        if (!lyrics.empty()) {
            *lyrics_out = g_strdup(lyrics.c_str());
            *is_sync_out = TRUE;
            g_free(lrc_path);
            return TRUE;
        }
    }
    g_free(lrc_path);

    // 尝试.txt文件
    gchar* txt_path = glib_get_lrc_path(track_location, ".txt");
    if (txt_path && glib_file_exists(txt_path)) {
        std::string lyrics = glib_read_text_file(txt_path);
        if (!lyrics.empty()) {
            *lyrics_out = g_strdup(lyrics.c_str());
            *is_sync_out = FALSE;
            g_free(txt_path);
            return TRUE;
        }
    }
    g_free(txt_path);

    return FALSE;
}
